#include<bits/stdc++.h>
using namespace std;
namespace IO{
    const int BUF=1<<21;
    char buff[BUF],*p1=buff,*p2=buff;
    #define gc() (p1==p2&&(p2=((p1=buff)+fread(buff,1,BUF,stdin)),p1==p2)?EOF:*p1++)
    template<typename T>inline void read(T &x){
        char ch=gc();x=0;int f=1;
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();}
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=gc();
        x*=f;
    }
    char obuf[BUF],*p3=obuf;
    inline void pc(char ch){
        if(p3-obuf<BUF) *p3++=ch;
        else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch;
    }
    inline void put(const char *s){while(*s) pc(*s),++s;}
    char ch[32],ctop;
    template<typename T>inline void print(T x){
    	if(x<0) x=~x+1,pc('-');
        if(!x) return pc(48);
        while(x) ch[++ctop]=x%10^48,x/=10;
        while(ctop) pc(ch[ctop--]);
    }
    inline void flush(){fwrite(obuf,p3-obuf,1,stdout);p3=obuf;}
}
using namespace IO;
const int N=2e5+5;
int n,q,C,c[N],fa[N];
namespace SUB{
	int pre[N][15],nxt[N][15];
	inline void sol(){
		for(int i=1;i<=n;++i)
		for(int j=0;j<C;++j) pre[i][j]=((c[i]==j)?i:pre[i-1][j]); 
		for(int i=n;i;--i)
		for(int j=0;j<C;++j) nxt[i][j]=((c[i]==j)?i:nxt[i+1][j]);
		while(q--){
			int s,u;
			read(s),read(u);
			int l=0,r=n+1;
			for(int j=0;j<C;++j)if(!((s>>j)&1)){
				l=max(l,pre[u][j]);
				if(nxt[u][j]) r=min(nxt[u][j],r);
			}
			print(max(1,r-l-1)),pc('\n');
		}flush();exit(0);
	}
}
int f[N],sz[N],stk[N<<2],top;
inline int find(int x){while(f[x]^x) x=f[x];return x;}
struct cz{int cc,u,v;};
vector<cz> T[15];
inline void merge(int x,int y){
	x=find(x),y=find(y);
	if(x==y) return;
	if(sz[x]<sz[y]) swap(x,y);
	sz[x]+=sz[y];
	f[y]=x,stk[++top]=y;
}
struct que{int p,i;};
inline bool cmp(que x,que y){return x.p>y.p;}
vector<que> Q[1<<15];
int ans[N];
void solve(int x,int d){
	if(d==C){
		for(que cc:Q[x]) ans[cc.i]=sz[find(cc.p)];
		return;
	}
	solve(x,d+1);
	int lim=top;x|=1<<d;
	for(cz c:T[d]) if((x>>c.cc)&1) merge(c.u,c.v);
	solve(x,d+1);
	while(top>lim){
		int p=stk[top--];
		sz[f[p]]-=sz[p],f[p]=p;
	}
}
que id[20];
int main(){
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	read(n),read(q),read(C);
	for(int i=1;i<=n;++i) read(c[i]);
	bool sub=1;
	for(int i=2;i<=n;++i) read(fa[i]),sub&=(fa[i]==i-1);
	if(sub) SUB::sol();
	for(int i=0;i<C;++i) id[i].i=i;
	for(int i=2;i<=n;++i){
		if(id[c[i]].p>id[c[fa[i]]].p) ++id[c[fa[i]]].p;
		else ++id[c[i]].p;
	}
	int rk[20];
	sort(id,id+C,cmp);
	for(int i=0;i<C;++i) rk[id[i].i]=i;
	for(int i=2;i<=n;++i){
		int x=rk[c[i]],y=rk[c[fa[i]]];
		if(x>y) swap(x,y);
		T[y].emplace_back((cz){x,fa[i],i});
	}
	for(int i=1;i<=q;++i){
		int s,u,S=0;
		read(s),read(u);
		for(int j=0;j<C;++j) if((s>>j)&1) S|=1<<rk[j];
		Q[S].emplace_back((que){u,i});
	}
	for(int i=1;i<=n;++i) f[i]=i,sz[i]=1;
	solve(0,0);
	for(int i=1;i<=q;++i) print(max(1,ans[i])),pc('\n');
	flush();
	return 0;
}


